home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / util / Security.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  6.6 KB  |  292 lines

  1. package com.extensibility.util;
  2.  
  3. import java.util.Calendar;
  4. import java.util.GregorianCalendar;
  5. import java.util.Random;
  6.  
  7. public final class Security {
  8.    private static final int NO_ERROR = -1;
  9.    private long regCode;
  10.    private long errDigit = -1L;
  11.    private static final byte SCHEME_HASH_NAME_ORG = 7;
  12.    private static final byte SCHEME_ID_BASED = 8;
  13.    private static long[] SEED = new long[]{5866932300294644261L, 7024403726759890087L, 2748076388224288114L, -6132556317925417883L, -377129364045086088L, -7907032981491668086L, 1545863772813216586L, -2073066160489659954L, 214103949628198354L, 5343966063913332048L, -4762362384337982286L, -7998867701170400188L, 2496590497142445312L, -8588422786031584434L, -3310401677126329201L, 2156169837751358096L};
  14.    public static byte LAUNCH_LIMIT_MASK = 1;
  15.    public static byte BIZ_ONLY_MASK = 2;
  16.    public static byte EXCELLON_30DAY_MASK = 4;
  17.    private static Random random = new Random(System.currentTimeMillis());
  18.  
  19.    public static String generateRegCode7(byte var0, String var1, String var2, Calendar var3, int var4, byte var5) {
  20.       return createRegCode7(var0, var1, var2, var3, var4, var5).format();
  21.    }
  22.  
  23.    public static String generateRegCode8(byte var0, int var1, Calendar var2, int var3, byte var4) {
  24.       return createRegCode8(var0, var1, var2, var3, var4).format();
  25.    }
  26.  
  27.    public static Security createRegCode8(byte var0, int var1, Calendar var2, int var3, byte var4) {
  28.       long var5 = 0L;
  29.       var5 = setDigit(var5, (long)digit((long)var0, 0), 3);
  30.       var5 = setDigit(var5, (long)digit((long)var1, 3), 8);
  31.       var5 = setDigit(var5, (long)digit((long)var1, 2), 7);
  32.       var5 = setDigit(var5, (long)digit((long)var1, 1), 0);
  33.       var5 = setDigit(var5, (long)digit((long)var1, 0), 12);
  34.       int var7 = var2.get(1);
  35.       int var8 = var2.get(6);
  36.       int var9 = (var7 - 1999) * 365 + var8;
  37.       var5 = setDigit(var5, (long)digit((long)var9, 2), 10);
  38.       var5 = setDigit(var5, (long)digit((long)var9, 1), 13);
  39.       var5 = setDigit(var5, (long)digit((long)var9, 0), 1);
  40.       var5 = setDigit(var5, (long)digit((long)var3, 1), 9);
  41.       var5 = setDigit(var5, (long)digit((long)var3, 0), 2);
  42.       var5 = setDigit(var5, (long)digit((long)var4, 0), 4);
  43.       var5 = munge(var5);
  44.       var5 = setDigit(var5, 8L, 5);
  45.       var5 = checksum(var5);
  46.       return new Security(var5);
  47.    }
  48.  
  49.    public static Security createRegCode7(byte var0, String var1, String var2, Calendar var3, int var4, byte var5) {
  50.       long var6 = 0L;
  51.       var6 = setDigit(var6, (long)digit((long)var0, 0), 3);
  52.       int var8 = hash(var1) ^ hash(var2);
  53.       var6 = setDigit(var6, (long)digit((long)var8, 3), 8);
  54.       var6 = setDigit(var6, (long)digit((long)var8, 2), 7);
  55.       var6 = setDigit(var6, (long)digit((long)var8, 1), 0);
  56.       var6 = setDigit(var6, (long)digit((long)var8, 0), 12);
  57.       int var9 = var3.get(1);
  58.       int var10 = var3.get(6);
  59.       int var11 = (var9 - 1999) * 365 + var10;
  60.       var6 = setDigit(var6, (long)digit((long)var11, 2), 10);
  61.       var6 = setDigit(var6, (long)digit((long)var11, 1), 13);
  62.       var6 = setDigit(var6, (long)digit((long)var11, 0), 1);
  63.       var6 = setDigit(var6, (long)digit((long)var4, 1), 9);
  64.       var6 = setDigit(var6, (long)digit((long)var4, 0), 2);
  65.       var6 = setDigit(var6, (long)digit((long)var5, 0), 4);
  66.       var6 = munge(var6);
  67.       var6 = setDigit(var6, 7L, 5);
  68.       var6 = checksum(var6);
  69.       return new Security(var6);
  70.    }
  71.  
  72.    private static boolean isKnownScheme(int var0) {
  73.       return var0 == 7 || var0 == 8;
  74.    }
  75.  
  76.    private static long parseLong(String var0) throws NumberFormatException {
  77.       char var1 = var0.charAt(0);
  78.       long var2 = (long)Character.digit(var1, 16);
  79.       if (var2 > (long)7) {
  80.          String var4 = var0.substring(1);
  81.          var2 -= (long)8;
  82.          var1 = (new Long(var2)).toString().charAt(0);
  83.          String var5 = String.valueOf(var1).concat(String.valueOf(var0.substring(1)));
  84.          long var6 = Long.parseLong(var5, 16);
  85.          var6 = Long.MIN_VALUE + var6;
  86.          if (!Long.toHexString(var6).equalsIgnoreCase(var0)) {
  87.             Debug.trace(String.valueOf(String.valueOf(Long.toHexString(var6)).concat(String.valueOf(" != "))).concat(String.valueOf(var0)));
  88.          }
  89.  
  90.          return var6;
  91.       } else {
  92.          return Long.parseLong(var0, 16);
  93.       }
  94.    }
  95.  
  96.    public static Security createRegCode(byte var0, String var1, String var2, String var3) {
  97.       byte var4 = -1;
  98.       var3 = StringUtilities.replace(var3, "-", "");
  99.  
  100.       try {
  101.          long var5 = parseLong(var3);
  102.          int var7 = digit(var5, 5);
  103.          if (!isKnownScheme(var7)) {
  104.             var4 = 5;
  105.          }
  106.  
  107.          long var8 = checksum(var5);
  108.          if (digit(var5, 6) != digit(var8, 6)) {
  109.             var4 = 6;
  110.          }
  111.  
  112.          if (digit(var5, 11) != digit(var8, 11)) {
  113.             var4 = 11;
  114.          }
  115.  
  116.          long var10 = unmunge(var5);
  117.          switch (var7) {
  118.             case 7:
  119.                int var12 = hash(var1) ^ hash(var2);
  120.                if (digit(var10, 8) != digit((long)var12, 3)) {
  121.                   var4 = 8;
  122.                }
  123.  
  124.                if (digit(var10, 7) != digit((long)var12, 2)) {
  125.                   var4 = 7;
  126.                }
  127.  
  128.                if (digit(var10, 0) != digit((long)var12, 1)) {
  129.                   var4 = 0;
  130.                }
  131.  
  132.                if (digit(var10, 12) != digit((long)var12, 0)) {
  133.                   var4 = 12;
  134.                }
  135.             case 8:
  136.             default:
  137.                if (digit(var10, 3) != digit((long)var0, 0)) {
  138.                   var4 = 3;
  139.                }
  140.  
  141.                Security var13 = new Security(munge(var10), var4);
  142.                return var13;
  143.          }
  144.       } catch (RuntimeException var14) {
  145.          ((Throwable)var14).printStackTrace();
  146.          Security var6 = new Security(0L, 0);
  147.          return var6;
  148.       }
  149.    }
  150.  
  151.    public boolean isValid() {
  152.       return this.errDigit == (long)-1;
  153.    }
  154.  
  155.    private Security(long var1) {
  156.       this.regCode = var1;
  157.    }
  158.  
  159.    private Security(long var1, int var3) {
  160.       this.regCode = var1;
  161.       this.errDigit = (long)var3;
  162.    }
  163.  
  164.    private static String format(long var0) {
  165.       StringBuffer var2 = new StringBuffer(Long.toHexString(var0));
  166.       if (var2.length() < 16) {
  167.          var2.insert(0, (new String("0000000000000000")).substring(0, 16 - var2.length()));
  168.       }
  169.  
  170.       var2.insert(12, '-');
  171.       var2.insert(8, '-');
  172.       var2.insert(4, '-');
  173.       return var2.toString();
  174.    }
  175.  
  176.    public String format() {
  177.       StringBuffer var1 = new StringBuffer(Long.toHexString(this.regCode));
  178.       if (var1.length() < 16) {
  179.          var1.insert(0, (new String("0000000000000000")).substring(0, 16 - var1.length()));
  180.       }
  181.  
  182.       var1.insert(12, '-');
  183.       var1.insert(8, '-');
  184.       var1.insert(4, '-');
  185.       return var1.toString().toUpperCase();
  186.    }
  187.  
  188.    private long naked() {
  189.       return unmunge(this.regCode);
  190.    }
  191.  
  192.    public GregorianCalendar getExpirationDate() {
  193.       int var1 = digit(this.regCode, 9);
  194.       int var2 = digit(this.regCode, 2);
  195.       int var3 = digit(this.naked(), 9) * 16 + digit(this.naked(), 2);
  196.       if (var3 == 0) {
  197.          return null;
  198.       } else {
  199.          GregorianCalendar var4 = this.getGenDate();
  200.          var4.add(5, var3);
  201.          return var4;
  202.       }
  203.    }
  204.  
  205.    public boolean isExpired() {
  206.       int var1 = digit(this.naked(), 9) * 16 + digit(this.naked(), 2);
  207.       if (var1 == 0) {
  208.          return false;
  209.       } else {
  210.          GregorianCalendar var2 = this.getGenDate();
  211.          var2.add(5, var1);
  212.          return var2.before(new GregorianCalendar());
  213.       }
  214.    }
  215.  
  216.    public GregorianCalendar getGenDate() {
  217.       int var1 = digit(this.naked(), 10) * 256 + digit(this.naked(), 13) * 16 + digit(this.naked(), 1);
  218.       int var2 = 1999 + var1 / 365;
  219.       int var3 = var1 % 365;
  220.       return new GregorianCalendar(var2, 0, var3);
  221.    }
  222.  
  223.    public int getRestrictions() {
  224.       return digit(this.naked(), 4);
  225.    }
  226.  
  227.    public boolean isLaunchLimited() {
  228.       return (digit(this.naked(), 4) & LAUNCH_LIMIT_MASK) > 0;
  229.    }
  230.  
  231.    public boolean isBizTalkOnly() {
  232.       return (digit(this.naked(), 4) & BIZ_ONLY_MASK) > 0;
  233.    }
  234.  
  235.    public boolean isExcellon30Day() {
  236.       return (digit(this.naked(), 4) & EXCELLON_30DAY_MASK) > 0;
  237.    }
  238.  
  239.    private static long setDigit(long var0, long var2, int var4) {
  240.       var0 &= 15L << var4 * 4 ^ 0L - 1L;
  241.       var0 |= var2 << var4 * 4;
  242.       return var0;
  243.    }
  244.  
  245.    private static int digit(long var0, int var2) {
  246.       return (int)((var0 & 15L << var2 * 4) >>> var2 * 4);
  247.    }
  248.  
  249.    private static int hash(String var0) {
  250.       int var1 = 0;
  251.       int var2 = 0;
  252.       int var3 = var0.length();
  253.       char[] var4 = var0.toCharArray();
  254.       if (var3 < 16) {
  255.          for(int var5 = var3; var5 > 0; --var5) {
  256.             var1 = var1 * 37 + var4[var2++];
  257.          }
  258.       } else {
  259.          int var7 = var3 / 8;
  260.  
  261.          for(int var6 = var3; var6 > 0; var2 += var7) {
  262.             var1 = var1 * 39 + var4[var2];
  263.             var6 -= var7;
  264.          }
  265.       }
  266.  
  267.       return var1;
  268.    }
  269.  
  270.    private static long munge(long var0) {
  271.       int var2 = Math.min(15, (int)(random.nextFloat() * (float)16));
  272.       long var3 = var0 ^ SEED[var2];
  273.       var3 = setDigit(var3, (long)var2, 14);
  274.       return var3;
  275.    }
  276.  
  277.    private static long checksum(long var0) {
  278.       long var2 = setDigit(var0, 0L, 6);
  279.       var2 = setDigit(var2, 0L, 11);
  280.       long var4 = var2 / (long)13;
  281.       var2 = setDigit(var2, (long)digit(var4, 1), 6);
  282.       var2 = setDigit(var2, (long)digit(var4, 0), 11);
  283.       return var2;
  284.    }
  285.  
  286.    private static long unmunge(long var0) {
  287.       int var2 = digit(var0, 14);
  288.       var0 = setDigit(var0, 0L, 14);
  289.       return var0 ^ SEED[var2];
  290.    }
  291. }
  292.